package com.mjf.scala.chapter05

/**
 * 自定义函数，实现while循环
 */
object Scala09_TestMyWhile {
  def main(args: Array[String]): Unit = {

    // while循环
    /*    var n = 5
        while (n >= 1) {
          println(n)
          n -= 1
        }*/


    // 使用普通函数实现
/*    def myWhile(condition: => Boolean, op: => Unit): Unit = {
      if (condition) {
        op
        myWhile(condition, op) // 递归调用，达到多次执行的效果
      }
    }

    var n = 5
    myWhile(n >= 1, {
      println(n)
      n -= 1
    })*/



    // 使用柯里化实现
    // 柯里化好处一：将一个参数列表的多个参数，拆分为多个参数列表，这样参数所代表的含义，清晰、明确
    def myWhile(condition: => Boolean)(op: => Unit): Unit = {
      if (condition) {
        op
        myWhile(condition)(op) // 递归调用，达到多次执行的效果
      }
    }

    var n = 5
    myWhile(n >= 1) {
      println(n)
      n -= 1
    }


    // 使用闭包的形式，实现myWhile循环
    // 外层函数的参数表示循环条件
    // 柯里化好处二：简化闭包的编写
/*
    def myWhile(condition: =>Boolean): (=>Unit) => Unit = {
      // 内层函数表示循环体
      def ff(op: =>Unit): Unit = {
        if(condition){
          op
          myWhile(condition)(op)
        }
      }
      ff _
    }

    var n = 5
    myWhile(n >= 1)({
      println(n)
      n -= 1
    })
*/


  }
}
